#include "modbuswig.h"
#include "ui_modbuswig.h"
#include "globalval.h"

ModbusWig::ModbusWig(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ModbusWig)
{
    ui->setupUi(this);

    // 连接按钮点击信号到槽函数
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_publishButton_clicked()));
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(on_publishButton2_clicked()));
    connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(on_publishButton3_clicked()));
    connect(ui->pushButton_4, SIGNAL(clicked()), this, SLOT(on_publishButton4_clicked()));


}

ModbusWig::~ModbusWig()
{
    delete ui;
}
void ModbusWig::on_publishButton_clicked()
{
    airflag = !airflag;
    // 创建JSON对象
    QJsonObject jsonObject;

    // 添加控制指令类型
    jsonObject["type"] = QJsonValue(2);

    // 创建数据子对象
    QJsonObject dataObject;

    // 添加数据点唯一标识和数据点键值
    dataObject["key"] = QJsonValue(103);

    if(airflag==0)
        dataObject["val"] = QJsonValue("1");
    else if(airflag==1)
        dataObject["val"] = QJsonValue("0");

    // 将数据子对象添加到主对象
    jsonObject["data"] = dataObject;

    // 创建QJsonDocument并添加JSON对象
    QJsonDocument jsonDoc(jsonObject);

    // 将JSON文档序列化为字符串
    QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);

    // 创建一个QMQTT::Message对象
    QMQTT::Message message;
    message.setTopic("lc"); // 设置发布的主题
    message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
    message.setQos(1); // 设置服务质量等级

    // 使用MqttHandler实例发布消息
    quint16 messageId = GlobalVal::mqtt->publish(message);
    qDebug() << "Message published with ID" << messageId;
}

void ModbusWig::on_publishButton2_clicked()
{
    lightflag = !lightflag;
    // 创建JSON对象
    QJsonObject jsonObject;

    // 添加控制指令类型
    jsonObject["type"] = QJsonValue(2);

    // 创建数据子对象
    QJsonObject dataObject;

    // 添加数据点唯一标识和数据点键值
    dataObject["key"] = QJsonValue(105);

    if(lightflag==0)
        dataObject["val"] = QJsonValue("1");
    else if(lightflag==1)
        dataObject["val"] = QJsonValue("0");

    // 将数据子对象添加到主对象
    jsonObject["data"] = dataObject;

    // 创建QJsonDocument并添加JSON对象
    QJsonDocument jsonDoc(jsonObject);

    // 将JSON文档序列化为字符串
    QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);

    // 创建一个QMQTT::Message对象
    QMQTT::Message message;
    message.setTopic("lc"); // 设置发布的主题
    message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
    message.setQos(1); // 设置服务质量等级

    // 使用MqttHandler实例发布消息
    quint16 messageId = GlobalVal::mqtt->publish(message);
    qDebug() << "Message published with ID" << messageId;
}

void ModbusWig::on_publishButton3_clicked()
{
    lockflag = !lockflag;
    // 创建JSON对象
    QJsonObject jsonObject;

    // 添加控制指令类型
    jsonObject["type"] = QJsonValue(2);

    // 创建数据子对象
    QJsonObject dataObject;

    // 添加数据点唯一标识和数据点键值
    dataObject["key"] = QJsonValue(106);

    if(lockflag==0)
        dataObject["val"] = QJsonValue("1");
    else if(lockflag==1)
        dataObject["val"] = QJsonValue("0");

    // 将数据子对象添加到主对象
    jsonObject["data"] = dataObject;

    // 创建QJsonDocument并添加JSON对象
    QJsonDocument jsonDoc(jsonObject);

    // 将JSON文档序列化为字符串
    QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);

    // 创建一个QMQTT::Message对象
    QMQTT::Message message;
    message.setTopic("lc"); // 设置发布的主题
    message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
    message.setQos(1); // 设置服务质量等级

    // 使用MqttHandler实例发布消息
    quint16 messageId = GlobalVal::mqtt->publish(message);
    qDebug() << "Message published with ID" << messageId;
}

void ModbusWig::on_publishButton4_clicked()
{
    beepflag = !beepflag; // 直接反转状态
    // 创建JSON对象
    QJsonObject jsonObject;

    // 添加控制指令类型
    jsonObject["type"] = QJsonValue(2);

    // 创建数据子对象
    QJsonObject dataObject;

    // 添加数据点唯一标识和数据点键值
    dataObject["key"] = QJsonValue(107);

    if(beepflag==0)
        dataObject["val"] = QJsonValue("1");
    else if(beepflag==1)
        dataObject["val"] = QJsonValue("0");

    // 将数据子对象添加到主对象
    jsonObject["data"] = dataObject;

    // 创建QJsonDocument并添加JSON对象
    QJsonDocument jsonDoc(jsonObject);

    // 将JSON文档序列化为字符串
    QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);

    // 创建一个QMQTT::Message对象
    QMQTT::Message message;
    message.setTopic("lc"); // 设置发布的主题
    message.setPayload(jsonString.toUtf8()); // 设置消息内容，注意转换
    message.setQos(1); // 设置服务质量等级

    // 使用MqttHandler实例发布消息
    quint16 messageId = GlobalVal::mqtt->publish(message);
    qDebug() << "Message published with ID" << messageId;
}
QString ModbusWig::getValueForKey(QMap<int, QString> map, int key) {
    if (map.contains(key)) {
        return map.value(key);
    } else {
        return "Key not found";
    }
}
void ModbusWig::dataUpSlot(QByteArray data)
{
    // 反序列化JSON数据
    QJsonDocument doc = QJsonDocument::fromJson(data);
    // 创建一个用于存储键值对的QMap
    QMap<int, QString> keyValueMap;

    if (!doc.isNull() && doc.isObject()) {
        QJsonObject json = doc.object();


        // 解析type字段
        if (json.contains("type") && json["type"].isDouble()) {
            int type = json["type"].toInt();
            // 可以选择将type也存储在map中，或者直接显示
            //ui->textBrowser->append("Type: " + QString::number(type));
        }

        // 解析result字段
        if (json.contains("result") && json["result"].isDouble()) {
            int result = json["result"].toInt();
            // 可以选择将result也存储在map中，或者直接显示
            //ui->textBrowser->append("Result: " + QString::number(result));
        }

        // 解析data数组
        if (json.contains("data") && json["data"].isArray()) {
            QJsonArray dataArray = json["data"].toArray();
            // 遍历QJsonArray，并填充keyValueMap
            for (int i = 0; i < dataArray.size(); ++i) {
                QJsonValue value = dataArray.at(i);
                if (value.isObject()) {
                    QJsonObject dataObj = value.toObject();

                    // 解析key和val字段
                    if (dataObj.contains("key") && dataObj["key"].isDouble() &&
                        dataObj.contains("val") && dataObj["val"].isString()) {
                        int key = dataObj["key"].toInt();
                        QString val = dataObj["val"].toString();
                        keyValueMap.insert(key, val); // 将键值对存储到map中
                    }
                }
            }
        }

    } else {
        // 如果JSON数据无效，输出错误信息
        ui->textBrowser->append("Invalid JSON data");
    }
    QString valueFor101 = getValueForKey(keyValueMap, 101);//温度
    ui->textBrowser->clear();
    ui->textBrowser->append("温度: " + valueFor101);
    QString valueFor102 = getValueForKey(keyValueMap, 102);//湿度
    ui->textBrowser_2->clear();
    ui->textBrowser_2->append("湿度: " + valueFor102);
    QString valueFor103 = getValueForKey(keyValueMap, 103);//空调
    if(valueFor103=="0")
    {
        airflag=0;
    }
    else if(valueFor103=="1")
    {
        airflag=1;
    }
    QString valueFor104 = getValueForKey(keyValueMap, 104);//二氧化碳
    ui->textBrowser_3->clear();
    ui->textBrowser_3->append("二氧化碳浓度: " + valueFor104);
    QString valueFor105 = getValueForKey(keyValueMap, 105);//灯
    if(valueFor105=="0")
    {
        lightflag=0;
        ui->pushButton_2->setStyleSheet(
            "QPushButton {"
            "   border: none; "
            "   background-image: url(:/new/prefix/lightoff.jpg); " // 设置背景图片
            "   background-position: center; " // 图片居中显示
            "   background-repeat: no-repeat; " // 不重复图片
            "}"
        );
    }
    else if(valueFor105=="1")
    {
         lightflag=1;
        ui->pushButton_2->setStyleSheet(
            "QPushButton {"
            "   border: none; "
            "   background-image: url(:/new/prefix/lighton.jpg); " // 设置背景图片
            "   background-position: center; " // 图片居中显示
            "   background-repeat: no-repeat; " // 不重复图片
            "}"
        );
    }
    QString valueFor106 = getValueForKey(keyValueMap, 106);//门锁
    if(valueFor106=="0")
    {
        lockflag=0;
    }
    else if(valueFor105=="1")
    {
        lockflag=1;
    }
    QString valueFor107 = getValueForKey(keyValueMap, 107);//蜂鸣器
    if(valueFor107=="0")
    {
        beepflag=0;
    }
    else if(valueFor107=="1")
    {
        beepflag=1;
    }
}
